﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace TD.bom
{
    /// <summary>
    /// Template d'un monstre, i.e. ensemble d'éléments permettant de créer un monstre
    /// </summary>
    public class MonsterTemplate : TemplateBase
    {
        #region Propriétés

        /// <summary>
        /// Nombre de points de vie
        /// </summary>
        public int HP { get; private set; }

        /// <summary>
        /// Armure
        /// </summary>
        public int Armor { get; private set; }
        
        /// <summary>
        /// Vitesse de déplacement en case(si si) / s
        /// </summary>
        public double Speed { get; private set; }

        /// <summary>
        /// Montant rapporté par le monstre une fois abatu
        /// </summary>
        public int Price { get; private set; }

        /// <summary>
        /// Taille du monstre
        /// </summary>
        public MapObjectSize Size { get; private set; }

        #endregion

        /// <summary>
        /// Obtient un template de monstre
        /// </summary>
        /// <param name="p_templateName">Nom du template</param>
        /// <returns>Instance de MonsterTemplate si trouvé, null sinon</returns>
        public new static MonsterTemplate Get(string p_templateName)
        {
            // On regarde d'abord si le template existe en cache
            MonsterTemplate l_template = (MonsterTemplate)TemplateBase.Get(p_templateName);
            if (l_template != null)
            {
                // Si oui, on le renvoie
                return l_template;
            }

            // Sinon, il faut le charger
            l_template = Load(p_templateName);
            if (l_template != null)
            {
                // Et le mettre en cache pour la prochaine fois
                m_cache.Add(p_templateName, l_template);
            }

            return l_template;
        }

        /// <summary>
        /// Charge le template ayant le nom spécifié
        /// </summary>
        /// <param name="p_templateName">Nom du template à charger</param>
        /// <returns>Instance de MonsterTemplate si trouvé, null sinon</returns>
        protected static MonsterTemplate Load(string p_templateName)
        {
            // TODO : implémenter un chargement à partir d'un entrepôt quelconque
            // serveur (par service web), ressources...
            MonsterTemplate l_template = new MonsterTemplate();

            switch (p_templateName)
            {
                case "monster/1":
                    {
                        l_template.HP = 100;
                        l_template.Armor = 0;
                        l_template.Speed = 1;
                        l_template.Price = 5;
                        l_template.Size = new MapObjectSize(20, 20);
                        break;
                    }

                case "monster/2":
                    {
                        l_template.HP = 10;
                        l_template.Armor = 10;
                        l_template.Speed = 0.5d;
                        l_template.Price = 15;
                        l_template.Size = new MapObjectSize(10, 10);
                        break;
                    }

                default:
                    {
                        throw new ArgumentOutOfRangeException("p_templateName", "Ce template de monstre n'existe pas");
                    }
            }

            return l_template;
        }
    }
}
